In the heart of the city, the Adventurer Guild sends missives, sealed with their emblem.
人與人之攀談,乃訊息、情報流通之一環,今若二者間有千里之遙,則何以交談?有鑒於此,信札便由此誕生,信札乃成人所欲言之語,其言寫於札上,並委以信使傳遞,而信使則成二者間攀談之途徑,久而久之,交通發達,處處設立郵驛,遞信已成日常事。而公會因事務所需,以書信聯繫冒險者早已習以為常,其目的不外乎委託任務、派發報酬、告知要事等等,由此可想公會郵遞系統必根深蒂固。
公會之郵遞系統以MailKit
完成,若要使用必須至「管理NuGet套件」處進行下載。下一步便是建立郵遞之資訊設定,至appsettings.json
處進行建立,需建之設定如下:
"MailSettings": {
"Server": "SMTP之地址",
"Port": 465, // 連接阜
"SenderName": "寄件人之名",
"SenderEmail": "寄件人之郵箱地址",
"UserName": "寄件人之帳號",
"Password": "寄件之第三方通行碼"
}
再建一DTO,以便運貨人紀錄郵遞之資訊。
public class MailConfig
{
public string Server { get; set; }
public int Port { get; set; }
public string SenderName { get; set; }
public string SenderEmail { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}
新增var mailConfig=builder.Configuration.GetSection("MailSettings").Get<MailConfig>();
於program.cs處,用來使運貨人實際紀錄郵遞之資訊,完成後,還需再進行MailConfig之註冊。
var mailConfig = builder.Configuration.GetSection("MailSettings").Get<MailConfig>();
if (mailConfig != null)
{
builder.Services.AddSingleton(mailConfig);
}
萬事俱備,便可進行撰寫信札及寄信之事項,首先依舊是於DTO中創立寄信之格式
public class MailData
{
public string Name { get; set; } // 收件人之名
public string Dwelling { get; set; } // 收件人郵箱地址
public string Subject { get; set; } // 標題
public string Body { get; set; } // 內文
}
其次於Helper中建立MailHelper.cs,進行信札及寄信之各種事務之郵遞部門。首先為信札之創立:
public class MailHelper
{
// 依賴注入郵遞之資訊
private readonly MailConfig _mailConfig;
public MailHelper(MailConfig mailConfig)
{
_mailConfig = mailConfig;
}
// 書寫及寄信之流程
public void SendMail(MailData mailData)
{
var mail = CreateEmailMessage(mailData);
Send(mail);
}
// 書寫信札之處
private MimeMessage CreateEmailMessage(MailData mailData)
{
var message = new MimeMessage();
// From處,此處應填寄件人之資訊
message.From.Add(new MailboxAddress(_mailConfig.SenderName, _mailConfig.SenderEmail));
// To處,此處應填收件人之資訊
message.To.Add(new MailboxAddress(mailData.Name, mailData.Dwelling));
// Subject處,此處應填信件之標題
message.Subject = mailData.Subject;
// 內文之構築
var bodyBuilder = new BodyBuilder();
bodyBuilder.TextBody = mailData.Body;
// Body處,此處應填信件之內文
message.Body = bodyBuilder.ToMessageBody();
return message;
}
// 傳遞信札之處
private void Send(MimeMessage message)
{
using(var client = new SmtpClient())
{
try
{
// 連接至smtp伺服器
client.Connect(_mailConfig.Server, _mailConfig.Port, true);
// 寄件人之認證
client.Authenticate(_mailConfig.UserName, _mailConfig.Password);
// 寄信
client.Send(message);
}
catch
{
throw;
}
finally
{
client.Disconnect(true);
}
}
}
}
完成後謹記需於program.cs中進行builder.Services.AddSingleton<MailHelper>();
之註冊,方能使用遞信之事務。接著禮賓部便可將欲寫之信整理,並交由郵遞部門處理。
[ApiController]
[Route("[controller]")]
public class MailController : ControllerBase
{
private readonly MailHelper _mailHelper;
public MailController(MailHelper mailHelper)
{
_mailHelper = mailHelper;
}
[HttpPost]
public async Task<IActionResult> Index(MailData mailData)
{
_mailHelper.SendMail(mailData);
return Ok(mailData);
}
}
成功後便可於信箱中收到信札。